#include <iostream>
using std::cout;
using std::endl;
using std::ostream;

class CNY;
class USD{
public:
    USD(double value)
    :_value(value)
    {

    }
    //美元转换为人民币
    //operator CNY();

    friend class CNY;

    friend ostream & operator<<(ostream & os, const USD & usd);

private:
    double _value;
};

class CNY{
public:
    CNY(double value)
    :_value(value)
    {

    }

    //特殊形式的赋值运算符
#if 0
    CNY & operator=(const USD & usd){
        cout << "CNY::operator=(USD &)" << endl;
        _value = usd._value * 7.1;
        return *this;
    }
    //特殊形式的构造函数
#endif
    CNY(const USD & usd)
    :_value(usd._value * 7.1)
    {
        cout << "CNY(const USD &)" << endl;
    }

    friend ostream & operator<<(ostream & os, const CNY & cny);
private:
    double _value;
};
ostream & operator<<(ostream & os, const CNY & cny){
    os << cny._value << "元";
    return os;
}
ostream & operator<<(ostream & os, const USD & usd){
    os << "$" << usd._value;
    return os;
}
//USD::operator CNY(){
//    cout << "USD::operator CNY" << endl;
//    return CNY(_value * 7.1);
//}
//总结：
//不同类型之间的转换(usd---->cny)，除了可以使用类型转换函数(usd中)之外
//还可以使用赋值运算符函数来进行操作
//赋值运算符应该写在哪？？？？cny中
void test(){
    USD usd(100);
    CNY cny(100);
    //如果希望输出usd和cny的值，可以有两种方式：
    //1.编写一个print函数打印
    //2.重载输出流运算符函数
    cout << usd << endl;
    cout << cny << endl;
    //需求：希望将美元转换成cny人民币
    cny = usd;
    cout << cny << endl;
}

int main()
{
    test();
    return 0;
}

